package com.fan.play.media.engine

import android.content.Context
import android.view.Surface
import com.fan.play.utils.LogUtil
import java.lang.reflect.Modifier
import java.util.ArrayList

/**
 * 媒体引擎
 */
class MediaEngine {

    companion object {
        private const val LibName = "play"

        init {
            try {
                System.loadLibrary(LibName)
            } catch (e: Exception) {
                LogUtil.logError("load library failure. library name $LibName")
            }
        }
    }

    /**
     * 启动引擎
     *
     * @param context Application上下文
     * @return true is Success
     */
    external fun Create(context: Context): Boolean

    /**
     * 停止引擎
     */
    external fun Destroy()

    /**
     * 设置编码、解码类型
     * @param softDecode 解码类型
     * @param softEncode 编码类型
     */
    external fun SetCodecType(softDecode: Boolean, softEncode: Boolean)

    /**
     * 添加屏幕采集设备
     * @param width 屏幕宽
     * @param height 屏幕高
     * @return true:成功
     */
    external fun AddScreenDevice(width: Int, height: Int): Boolean

    /**
     * 添加网络采集设备
     * @param streamUrl 流地址
     * @param softDecode 解码模式
     * @param devType 设备类型
     * @return true:成功
     */
    external fun AddIPCameraDevice(streamUrl: String, softDecode: Boolean, devType: Int): Boolean

    /**
     * 删除设备
     * @param devID 设备ID
     */
    external fun DeleteCaptureDevice(devID: Int)

    /**
     * 清空所有采集设备
     */
    external fun ClearCaptureDevice()

    /**
     * 修改相机设备参数
     * @param width 相机预览宽
     * @param height 相机预览高
     */
    external fun ModifyCameraDevice(width: Int, height: Int)

    /**
     * 修改相机设备参数
     * @param devID 设备ID
     * @param width 相机预览宽
     * @param height 相机预览高
     */
    external fun ModifyCameraDevice(devID: Int, width: Int, height: Int)

    /**
     * 修改音频参数
     * @param sampleRate 采样率
     * @param channelNum 采样通道数
     * @param samplesBitPer 采样点位数
     */
    external fun ModifyAudioDevice(sampleRate: Int, channelNum: Int, samplesBitPer: Int)

    /**
     * 查找视频设备
     * @param devID 设备ID
     * @return 视频设备
     */
    external fun FindCaptureDevice(devID: Int): CaptureDevice?

    /**
     * 获取所有的视频采集设备
     * @return 视频采集设备集
     */
    external fun GetCaptureDevice(): ArrayList<CaptureDevice>

    /**
     * 返回本地相机的数量
     * @return 数量
     */
    external fun GetCameraDeviceNum(): Int

    /**
     * 注册采集设备的监听
     */
    external fun RegisterCaptureDeviceListener(listener: ICaptureDeviceListener?)

    /**
     * 开始采集
     * @param devID 设备ID
     * @return true:创建采集对象成功
     */
    external fun StartCapture(devID: Int): Boolean

    /**
     * 停止采集
     * @param devID 设备ID
     */
    external fun StopCapture(devID: Int)

    /**
     * 开始预览
     * @param devID 设备ID
     * @param surface 画布
     */
    external fun StartPreview(devID: Int, surface: Surface)

    /**
     * 停止预览
     * @param devID 设备ID
     */
    external fun StopPreview(devID: Int)

    /**
     * 开始录制
     * @param devID 设备ID
     * @param savePath 保存路径
     */
    external fun StartRecord(devID: Int, savePath: String)

    /**
     * 停止录制
     * @param devID 设备ID
     */
    external fun StopRecord(devID: Int)

    /**
     * 继续录制
     * @param devID 设备ID
     */
    external fun ResumeRecord(devID: Int)

    /**
     * 暂停录制
     * @param devID 设备ID
     */
    external fun PauseRecord(devID: Int)

    /**
     * 开始推流
     * @param devID 设备ID
     * @param pushUrl 推流地址
     */
    external fun StartPush(devID: Int, pushUrl: String)

    /**
     * 停止推流
     * @param devID 设备ID
     */
    external fun StopPush(devID: Int)
}